package slent.iespana.es.Quimica.TablaPeriodica.VentanaTablaPeriodica;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Hashtable;
import java.util.HashMap;

import es.iespana.slent.tablaperiodica.*;

/**
 * Created by IntelliJ IDEA.
 * User: slent
 * Date: 7/01/2010
 * Time: 10:29:23 PM
 * Esta clase se encarga de mostrar una ventana amigable para la configuracion
 * de valores de los elementos de la tabla periódica
 */
public class VentanaTablaPeriodica extends JFrame implements MouseListener, WindowListener {
    private Box panelTabla;
    private TablaPeriodicaDefault tablaDefault;
    private TablaPeriodica tablaPeriodica;
    private HashMap<Integer, TablaPeriodica.Elemento> mapaTablaPeriodica;
    private JPanel panelDatosElemento;
    private JTextField fieldNombre;
    private JTextField fieldSimbolo;
    private JTextField fieldNumeroAtomico;
    private JTextField fieldGrupo;
    private JTextField fieldPeriodo;
    private JTextField fieldMasaAtomica;
    private JTextField fieldElectronegatividad;
    private JTextField fieldConfiguracionElectronica;
    private JTextField fieldOrbital;
    private JTextField fieldRadioAtomico;
    private JTextField fieldRadioIonico;
    private JTextField fieldDensidad;

    private BarraHerramientas barraEdicion;
    private Elemento elementoSeleccionado;

    public VentanaTablaPeriodica() {
        super("Tabla Periódica");
        cargarTablaPeriodica();
        crearGUI();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setResizable(false);
        agregarListenerGuardar();
        agregarListenerCancelar();
        this.addWindowListener(this);
    }

    private void cargarTablaPeriodica() {
        tablaDefault = new TablaPeriodicaDefault();
        tablaDefault.cargarTablaPeriodica();
        tablaPeriodica = tablaDefault.getTablaPeriodica();
        mapaTablaPeriodica = new HashMap<Integer, TablaPeriodica.Elemento>();
        for (TablaPeriodica.Elemento elem : tablaPeriodica.getElemento()) {
            mapaTablaPeriodica.put(new Integer(elem.getNumeroAtomico()), elem);
        }

    }

    private void crearGUI() {
        panelTabla = Box.createVerticalBox();
        llenarTablaPeriodica();
        crearPanelDatos();
        getContentPane().setLayout(new BorderLayout());

        JPanel panelCentral = new JPanel(new BorderLayout());
        panelCentral.add(panelDatosElemento, BorderLayout.NORTH);
        panelCentral.add(panelTabla, BorderLayout.CENTER);
        getContentPane().add(panelCentral);
        getContentPane().add(barraEdicion = new BarraHerramientas(tablaDefault), BorderLayout.NORTH);
        barraEdicion.deshabilitar();
        this.habilitarTextFields(false);
    }

    /**
     * Se encarga de llenar la tabla desde el hashmap a la interfaz grafica
     */
    private void llenarTablaPeriodica() {
        Box fila1 = Box.createHorizontalBox();
        fila1.add(new Elemento(mapaTablaPeriodica.get(new Integer(1))));
        fila1.add(Box.createHorizontalGlue());
        fila1.add(new Elemento(mapaTablaPeriodica.get(new Integer(2))));

        for (Component cmp : fila1.getComponents())
            cmp.addMouseListener(this);

        Box fila2 = Box.createHorizontalBox();
        JPanel fila2_1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        fila2_1.add(new Elemento(mapaTablaPeriodica.get(new Integer(3))));
        fila2_1.add(new Elemento(mapaTablaPeriodica.get(new Integer(4))));
        for (Component cmp : fila2_1.getComponents())
            cmp.addMouseListener(this);

        fila2.add(fila2_1);
        fila2.add(Box.createHorizontalGlue());
        JPanel fila2_2 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        fila2_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(5))));
        fila2_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(6))));
        fila2_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(7))));
        fila2_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(8))));
        fila2_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(9))));
        fila2_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(10))));
        fila2.add(fila2_2);
        for (Component cmp : fila2_2.getComponents())
            cmp.addMouseListener(this);

        Box fila3 = Box.createHorizontalBox();
        JPanel fila3_1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        fila3_1.add(new Elemento(mapaTablaPeriodica.get(new Integer(11))));
        fila3_1.add(new Elemento(mapaTablaPeriodica.get(new Integer(12))));
        fila3.add(fila3_1);
        for (Component cmp : fila3_1.getComponents())
            cmp.addMouseListener(this);
        fila3.add(Box.createHorizontalGlue());
        JPanel fila3_2 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        fila3_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(13))));
        fila3_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(14))));
        fila3_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(15))));
        fila3_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(16))));
        fila3_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(17))));
        fila3_2.add(new Elemento(mapaTablaPeriodica.get(new Integer(18))));
        fila3.add(fila3_2);
        for (Component cmp : fila3_2.getComponents())
            cmp.addMouseListener(this);

        JPanel fila4 = new JPanel(new FlowLayout());
        for (int i = 19; i < 37; i++)
            fila4.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (Component cmp : fila4.getComponents())
            cmp.addMouseListener(this);

        JPanel fila5 = new JPanel(new FlowLayout());
        for (int i = 37; i < 55; i++)
            fila5.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (Component cmp : fila5.getComponents())
            cmp.addMouseListener(this);

        JPanel fila6 = new JPanel(new FlowLayout());
        for (int i = 55; i < 58; i++)
            fila6.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (int i = 72; i < 87; i++)
            fila6.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (Component cmp : fila6.getComponents())
            cmp.addMouseListener(this);

        JPanel fila7 = new JPanel(new FlowLayout());
        for (int i = 87; i < 90; i++)
            fila7.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (int i = 104; i < 119; i++)
            fila7.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (Component cmp : fila7.getComponents())
            cmp.addMouseListener(this);

        JPanel fila8 = new JPanel(new FlowLayout());
        fila8.add(new JLabel("Lantánidos"));
        for (int i = 58; i < 72; i++)
            fila8.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (Component cmp : fila8.getComponents())
            cmp.addMouseListener(this);

        JPanel fila9 = new JPanel(new FlowLayout());
        fila9.add(new JLabel("Actínidos"));
        for (int i = 90; i < 104; i++)
            fila9.add(new Elemento(mapaTablaPeriodica.get(new Integer(i))));
        for (Component cmp : fila9.getComponents())
            cmp.addMouseListener(this);

        panelTabla.add(fila1);
        panelTabla.add(fila2);
        panelTabla.add(fila3);
        panelTabla.add(fila4);
        panelTabla.add(fila5);
        panelTabla.add(fila6);
        panelTabla.add(fila7);
        panelTabla.add(Box.createRigidArea(new Dimension(30, 30)));
        panelTabla.add(fila8);
        panelTabla.add(fila9);
    }

    private void crearPanelDatos() {
        panelDatosElemento = new JPanel(new GridLayout(4, 3, 3, 3));
        panelDatosElemento.add(new JLabel("Nombre"));
        panelDatosElemento.add(fieldNombre = new JTextField("Wolframio"));
        panelDatosElemento.add(new JLabel("Simbolo"));
        panelDatosElemento.add(fieldSimbolo = new JTextField(2));
        panelDatosElemento.add(new JLabel("Número atómico"));
        panelDatosElemento.add(fieldNumeroAtomico = new JTextField(3));
        panelDatosElemento.add(new JLabel("Grupo"));
        panelDatosElemento.add(fieldGrupo = new JTextField(2));
        panelDatosElemento.add(new JLabel("Periodo"));
        panelDatosElemento.add(fieldPeriodo = new JTextField(2));
        panelDatosElemento.add(new JLabel("Masa Atómica"));
        panelDatosElemento.add(fieldMasaAtomica = new JTextField(5));
        panelDatosElemento.add(new JLabel("Electronegatividad"));
        panelDatosElemento.add(fieldElectronegatividad = new JTextField(5));
        panelDatosElemento.add(new JLabel("Configuracion electrónica"));
        panelDatosElemento.add(fieldConfiguracionElectronica = new JTextField(10));
        panelDatosElemento.add(new JLabel("Orbital"));
        panelDatosElemento.add(fieldOrbital = new JTextField(5));
        panelDatosElemento.add(new JLabel("Radio atómico"));
        panelDatosElemento.add(fieldRadioAtomico = new JTextField(3));
        panelDatosElemento.add(new JLabel("Radio iónico"));
        panelDatosElemento.add(fieldRadioIonico = new JTextField(3));
        panelDatosElemento.add(new JLabel("Densidad"));
        panelDatosElemento.add(fieldDensidad = new JTextField(3));
    }

    /**
     * Habilita/deshabilita los textfield
     */
    private void habilitarTextFields(boolean enable) {
        fieldNombre.setEditable(enable);
        fieldSimbolo.setEditable(enable);
        fieldNumeroAtomico.setEditable(enable);
        fieldGrupo.setEditable(enable);
        fieldPeriodo.setEditable(enable);
        fieldMasaAtomica.setEditable(enable);
        fieldElectronegatividad.setEditable(enable);
        fieldConfiguracionElectronica.setEditable(enable);
        fieldOrbital.setEditable(enable);
        fieldRadioAtomico.setEditable(enable);
        fieldRadioIonico.setEditable(enable);
        fieldDensidad.setEditable(enable);
    }

    public void mouseClicked(MouseEvent e) {
        if (elementoSeleccionado != null) {
            if (elementoSeleccionado.equals((Elemento) e.getSource())) {
                elementoSeleccionado.desmarcar();
                elementoSeleccionado = null;
                barraEdicion.deshabilitar();
                habilitarTextFields(false);
            } else {
                elementoSeleccionado.desmarcar();
                System.out.println("desmarcar");
                elementoSeleccionado = (Elemento) e.getSource();
                elementoSeleccionado.seleccionar();
                barraEdicion.habilitar(elementoSeleccionado);
                habilitarTextFields(true);
                mostrarDetallesElemento(elementoSeleccionado);
            }
        } else {
            elementoSeleccionado = (Elemento) e.getSource();
            elementoSeleccionado.seleccionar();
            barraEdicion.habilitar(elementoSeleccionado);
            habilitarTextFields(true);
            mostrarDetallesElemento(elementoSeleccionado);
        }
    }

    public void mousePressed(MouseEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void mouseReleased(MouseEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void mouseEntered(MouseEvent e) {
        if (elementoSeleccionado != null) return;
        Elemento elemSeleccionado = (Elemento) e.getSource();
        mostrarDetallesElemento(elemSeleccionado);
    }

    private void mostrarDetallesElemento(Elemento elemSeleccionado){
        limpiarTextBox();
        fieldNombre.setText(elemSeleccionado.getElementoRelacionado().getNombre());
        if (elemSeleccionado.getElementoRelacionado().getNumeroAtomico() != null)
            fieldNumeroAtomico.setText(elemSeleccionado.getElementoRelacionado().getNumeroAtomico().toString());
        if (elemSeleccionado.getElementoRelacionado().getSimbolo() != null)
            fieldSimbolo.setText(elemSeleccionado.getElementoRelacionado().getSimbolo());
        if (elemSeleccionado.getElementoRelacionado().getGrupo() != null)
            fieldGrupo.setText(elemSeleccionado.getElementoRelacionado().getGrupo().toString());
        if (elemSeleccionado.getElementoRelacionado().getPeriodo() != null)
            fieldPeriodo.setText(elemSeleccionado.getElementoRelacionado().getPeriodo().toString());
        if (elemSeleccionado.getElementoRelacionado().getMasaAtomica() != null)
            fieldMasaAtomica.setText(elemSeleccionado.getElementoRelacionado().getMasaAtomica().toString());
        if (elemSeleccionado.getElementoRelacionado().getElectronegatividad() != null)
            fieldElectronegatividad.setText(elemSeleccionado.getElementoRelacionado().getElectronegatividad().toString());
        if (elemSeleccionado.getElementoRelacionado().getConfiguracionElectronica() != null)
            fieldConfiguracionElectronica.setText(elemSeleccionado.getElementoRelacionado().getConfiguracionElectronica());
        if (elemSeleccionado.getElementoRelacionado().getOrbital() != null)
            fieldOrbital.setText(elemSeleccionado.getElementoRelacionado().getOrbital());
        if (elemSeleccionado.getElementoRelacionado().getRadioAtomico() != null)
            fieldRadioAtomico.setText(elemSeleccionado.getElementoRelacionado().getRadioAtomico().toString());
        if (elemSeleccionado.getElementoRelacionado().getRadioIonico() != null)
            fieldRadioIonico.setText(elemSeleccionado.getElementoRelacionado().getRadioIonico().toString());
        if (elemSeleccionado.getElementoRelacionado().getDensidad() != null)
            fieldDensidad.setText(elemSeleccionado.getElementoRelacionado().getDensidad().toString());
    }

    private void limpiarTextBox(){
        fieldNombre.setText("");
        fieldNumeroAtomico.setText("");
        fieldSimbolo.setText("");
        fieldGrupo.setText("");
        fieldPeriodo.setText("");
        fieldMasaAtomica.setText("");
        fieldElectronegatividad.setText("");
        fieldConfiguracionElectronica.setText("");
        fieldOrbital.setText("");
        fieldRadioAtomico.setText("");
        fieldRadioIonico.setText("");
        fieldDensidad.setText("");
    }

    public void mouseExited(MouseEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void windowOpened(WindowEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void windowClosing(WindowEvent e) {
        if (barraEdicion.isCambiosRealizados())
            tablaDefault.guardarEnArchivo();
    }

    public void windowClosed(WindowEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void windowIconified(WindowEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void windowDeiconified(WindowEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void windowActivated(WindowEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void windowDeactivated(WindowEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void agregarListenerGuardar() {
        barraEdicion.getBotonGuardar().addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                elementoSeleccionado.getElementoRelacionado().setNombre(fieldNombre.getText());
                elementoSeleccionado.getElementoRelacionado().setSimbolo(fieldSimbolo.getText());
                elementoSeleccionado.getElementoRelacionado().setNumeroAtomico(
                        Integer.parseInt(fieldNumeroAtomico.getText()));
                elementoSeleccionado.getElementoRelacionado().setGrupo(
                        Integer.parseInt(fieldGrupo.getText())
                );//grupo
                elementoSeleccionado.getElementoRelacionado().setPeriodo(
                        Integer.parseInt(fieldPeriodo.getText())
                );//perido
                elementoSeleccionado.getElementoRelacionado().setMasaAtomica(
                        Double.parseDouble(fieldMasaAtomica.getText())
                );//masa
                elementoSeleccionado.getElementoRelacionado().setElectronegatividad(
                        Double.parseDouble(fieldElectronegatividad.getText())
                );//electroneg
                elementoSeleccionado.getElementoRelacionado().setConfiguracionElectronica(
                        fieldConfiguracionElectronica.getText()
                );//config elec
                elementoSeleccionado.getElementoRelacionado().setOrbital(
                        fieldOrbital.getText()
                );//orbital
                elementoSeleccionado.getElementoRelacionado().setRadioAtomico(
                        Double.parseDouble(fieldRadioAtomico.getText())
                );//radioatomico
                elementoSeleccionado.getElementoRelacionado().setRadioIonico(
                        Double.parseDouble(fieldRadioIonico.getText())
                );//radioionico
                elementoSeleccionado.getElementoRelacionado().setDensidad(
                        Double.parseDouble(fieldDensidad.getText())
                );//densidad

                habilitarTextFields(false);
                elementoSeleccionado.desmarcar();
                barraEdicion.deshabilitar();
            }
        });

    }

    public void agregarListenerCancelar() {
        barraEdicion.getBotonCancelar().addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                elementoSeleccionado.desmarcar();
                elementoSeleccionado = null;
                barraEdicion.deshabilitar();
                habilitarTextFields(false);
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                VentanaTablaPeriodica tablaPeriodica = new VentanaTablaPeriodica();
                tablaPeriodica.setVisible(true);
            }
        });
    }
}
